#pragma once
#include<cstdint>
#include<string>
#include<vector>


enum class MsgType : uint16_t
{
    //登录
    LOGIN_REQ=1001,
    LOGIN_RES=1002,
    REGISTER_REQ=1003,
    REGISTER_RES=1004,

    //消息
    TEXT_MSG=2001,
    IMAGE_MSG=2002,
    FILE_MSG=2003,

    //好友
    GET_FRIEND_LIST_REQ=3001,  // 获取好友列表请求
    GET_FRIEND_LIST_RES=3002,  // 获取好友列表响应
    ADD_FRIEND_REQ=3003,
    ADD_FRIEND_RES=3004,
    FRIEND_STATUS_NOTIFY=3005, // 好友状态变化通知（服务端主动推送）

    //文件下载
    FILE_DOWNLOAD_REQ=5001,     // 文件下载请求
    FILE_DOWNLOAD_RES=5002,     // 文件下载响应
    FILE_DOWNLOAD_PROGRESS=5003, // 文件下载进度

    //文件上传
    FILE_UPLOAD_REQ=5101,       // 文件上传请求
    FILE_UPLOAD_DATA=5102,      // 文件数据块
    FILE_UPLOAD_RES=5103,       // 文件上传响应
    FILE_GET_REQ=5104,          // 获取文件请求
    FILE_GET_RES=5105,          // 获取文件响应

    //系统
    HEARTBEAT=4001,
    ERROR_MSG=4002,
};  // ← 枚举定义必须以分号结尾


//消息头
#pragma pack(push, 1)
struct MessageHeader
{
    uint32_t length;
    uint16_t type;
};  // ← 结构体定义也必须以分号结尾
#pragma pack(pop)


//消息体

//登录请求
struct LoginRequest
{
    std::string username;
    std::string password;
};


//登录响应
struct LoginResponse
{
    bool success;
    std::string message;
    uint64_t user_id;
    std::string username;  // 用户名（登录账号）
    std::string nickname;  // 昵称（显示名称）
    std::string avatar_url;  // 头像URL
    std::string token;
};

//注册请求
struct RegisterRequest
{
    std::string username;
    std::string password;
    std::string nickname;
};

//注册响应
struct RegisterResponse
{
    bool success;
    std::string message;
    uint64_t user_id;
};

//文本消息
struct TextMessage
{
    uint64_t sender_id;
    uint64_t receiver_id;
    std::string content;
    uint64_t timestamp;
};

//获取好友列表请求
struct GetFriendListRequest
{
    uint64_t user_id;  // 请求者的用户ID
};

//好友信息
struct FriendInfo
{
    uint64_t user_id;
    std::string username;
    std::string nickname;
    std::string avatar;    // 头像URL（可选）
    int status;            // 在线状态：0=离线，1=在线
};

//获取好友列表响应
struct GetFriendListResponse
{
    bool success;
    std::string message;
    std::vector<FriendInfo> friends;  // 好友列表
};

//添加好友请求
struct AddFriendRequest
{
    uint64_t user_id;
    uint64_t friend_id;
    std::string message;
};

//添加好友响应
struct AddFriendResponse
{
    bool success;
    std::string message;
};

//好友状态变化通知（服务端主动推送）
struct FriendStatusNotify
{
    uint64_t user_id;      // 状态变化的好友ID
    int status;            // 新状态：0=离线，1=在线
    int64_t timestamp;     // 时间戳
};

//心跳包
struct HeartBeat
{
    uint64_t timestamp;
};

//错误消息
struct ErrorMessage
{
    uint32_t error_code;
    std::string error_msg;
};

//文件下载请求
struct FileDownloadRequest
{
    std::string url;           // 下载URL
    std::string save_name;     // 保存的文件名
    std::string save_path;     // 保存路径（可选）
};

//文件下载响应
struct FileDownloadResponse
{
    bool success;              // 是否成功
    std::string message;       // 响应消息
    std::string file_path;     // 文件保存路径
    uint64_t file_size;        // 文件大小（字节）
};

//文件下载进度
struct FileDownloadProgress
{
    std::string file_name;     // 文件名
    uint64_t downloaded;       // 已下载字节数
    uint64_t total;            // 总字节数
    uint32_t progress;         // 进度百分比 (0-100)
};

//文件上传请求（初始化上传会话）
struct FileUploadRequest
{
    std::string file_name;     // 文件名
    std::string file_type;     // 文件类型（avatar/document/image等）
    uint64_t file_size;        // 文件总大小（字节）
};

//文件数据块
struct FileUploadData
{
    std::string upload_id;     // 上传会话ID
    uint32_t chunk_index;      // 数据块索引
    std::string data;          // Base64编码的数据块
    bool is_last;              // 是否为最后一块
};

//文件上传响应
struct FileUploadResponse
{
    bool success;              // 是否成功
    std::string message;       // 响应消息
    std::string upload_id;     // 上传会话ID（首次返回）
    std::string file_path;     // 文件保存路径（完成时返回）
    std::string file_url;      // 文件访问URL（完成时返回）
};

//获取文件请求
struct FileGetRequest
{
    std::string file_path;     // 文件路径或文件ID
    std::string file_type;     // 文件类型（avatar等）
    uint64_t user_id;          // 用户ID（获取特定用户的文件）
};

//获取文件响应
struct FileGetResponse
{
    bool success;              // 是否成功
    std::string message;       // 响应消息
    std::string file_name;     // 文件名
    uint64_t file_size;        // 文件大小
    std::string data;          // Base64编码的文件数据
};





